package com.cskaoyan._02interface._07method;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/13 10:09
 **/
/*
方法传参:
    1. 形参如果写一个普通类：调用方法时需要传入的是该类的对象或者该类的子类对象
    2. 形参如果写一个抽象类：调用方法时需要传入的是该抽象类的子类对象
    3. 形参如果写一个接口：调用方法时需要传入的是该接口的子类对象

方法返回值:
    1. 返回值类型如果写一个普通类：可以返回该类的对象或者该类的子类对象
    2. 返回值类型如果写一个抽象类：返回该抽象类的子类对象。
    3. 返回值类型如果写一个接口：返回该接口的子类对象。

方法重写的返回值类型
1. 类：父类中的方法返回一个普通类类型
   - 子类方法中可以返回该类型
   - 也可以返回该类的子类类型
2. 抽象类：父类中的方法返回一个抽象类类型
   - 子类方法可以返回该类型
   - 也可以返回抽象类的实现类类型
3. 接口：父类中的方法返回一个接口类型
   - 子类方法可以返回该类型
   - 也可以返回接口的实现类类型
 */
public class Demo {
    public static void main(String[] args) {
        m1(new Father());
        m1(new Son());

        m2(new Son2());

        m3(new IAImpl());
    }

    // 传的是普通类型
    public static void m1(Father father) {

    }

    // 传的是抽象类型
    public static void m2(AbstractFather father) {

    }

    // 传接口类型
    public static void m3(IA ia) {

    }

    // 返回值为普通类对象
    public static Father m4() {
        //return new Father();

        // 返回子类对象
        return new Son();
    }

    // 返回值为抽象类型
    public static AbstractFather m5() {
        // 返回其子类对象
        return new Son2();

    }

    // 返回值为接口类型
    public static IA m6() {
        // 返回接口的子类对象
        return new IAImpl();

    }
}

class Father{
    public Fruit m1() {
        return new Fruit();
    }
}
class Son extends Father{
    @Override
    public Apple m1() {
        return new Apple();
    }
}

abstract class AbstractFather{

}

class Son2 extends AbstractFather{}

interface IA{

}
class IAImpl implements IA{

}

class Fruit{

}

class Apple extends Fruit{

}